import subprocess
import platform
import re


def find_and_terminate_process_on_port(port):
    system = platform.system()

    # 根据操作系统定义命令
    if system == 'Windows':
        command = f"netstat -ano | findstr :{port}"
        pid_pattern = re.compile(r'\s+(\d+)\s+')  # 正则表达式，用于从netstat输出中提取PID
    else:  # 假设是Linux或macOS
        command = f"lsof -ti :{port}"  # lsof 直接提供使用该端口的PID

    try:
        # 执行命令并获取输出
        output = subprocess.check_output(command, shell=True, text=True)

        if system == 'Windows':
            # 从输出中提取PID
            pid_match = pid_pattern.search(output)
            if pid_match:
                pid = pid_match.group(1)
            else:
                print(f"未找到使用端口 {port} 的进程。")
                return
        else:
            # 在Linux/macOS上，lsof直接给出PID（假设只有一个PID，如果有多个，可以处理）
            pids = output.strip().split('\n')
            if not pids:
                print(f"未找到使用端口 {port} 的进程。")
                return
            pid = pids[0]  # 假定单个PID，如有多个，可以处理多个PID

        print(f"找到PID为 {pid} 的进程使用端口 {port}。 正在终止...")
        terminate_process(system, pid)
    except subprocess.CalledProcessError as e:
        print(f"执行命令时出错: {e}")
    except Exception as e:
        print(f"发生意外错误: {e}")


def terminate_process(system, pid):
    try:
        if system == 'Windows':
            subprocess.run(['taskkill', '/F', '/PID', pid], check=True)
        else:
            subprocess.run(['kill', '-9', pid], check=True)
    except subprocess.CalledProcessError as e:
        print(f"无法终止PID为 {pid} 的进程: {e}")


if __name__ == '__main__':
    port = 8000  # 假设要停止的端口是8000
    find_and_terminate_process_on_port(port)